package com.alibaba.chaosblade.box.toolsmgr.ansible.command;

import com.alibaba.chaosblade.box.toolsmgr.ansible.AnsibleCommand;
import com.alibaba.chaosblade.box.toolsmgr.ansible.AnsibleCommandExtraVarsUtil;
import com.alibaba.chaosblade.box.toolsmgr.ansible.AnsibleConstants;
import com.alibaba.chaosblade.box.toolsmgr.model.MgrRequest;

import java.util.List;

/**
 * @author: xinyuan.ymm
 * @create: 2022-01-07 9:41 PM
 */
public class AnsiblePingCommand implements AnsibleCommand, AnsibleConstants {


    /**
     * 根据管理请求生成Ansible ping命令
     * @param mgrRequest 管理请求对象，包含目标主机IP、用户名等信息
     * @return 生成的Ansible ping命令字符串
     */
    @Override
    public String getCommand(MgrRequest mgrRequest) {
        // 构建基础ansible命令，指定目标主机IP
        String sb = String.format("ansible %s", mgrRequest.getInstanceIp());

        // 如果指定了用户名，则添加-u参数
        if (!mgrRequest.getInstanceUser().isEmpty()){
            sb = String.format("%s -u %s", sb, mgrRequest.getInstanceUser());
        }
        
        // 添加-m ping模块参数
        sb = String.format("%s -m ping", sb);

        // 添加额外变量参数（如端口、密码等）
        return String.format("%s %s", sb, AnsibleCommandExtraVarsUtil.getExtraVars(mgrRequest));
    }

    /**
     * 判断Ansible ping命令执行结果是否成功
     * @param result 命令执行结果列表
     * @param ignoreBackgroundTimeout 是否忽略后台超时（此参数在当前实现中未使用）
     * @return 如果执行结果包含"SUCCESS"则返回true，否则返回false
     */
    @Override
    public boolean resultPredicate(List<String> result, boolean ignoreBackgroundTimeout) {
        // 检查结果列表中的第一条记录是否包含"SUCCESS"关键字
        if (result.stream().findFirst().get().contains("SUCCESS")) {
            return true;
        }
        return false;
    }
}
